use std::sync::{
	atomic::{AtomicUsize, Ordering},
	LazyLock,
};

use tokio::runtime::{Builder, Runtime};

use crate::global_defin::global::format_current_dt_by_default;

// static THREAD_ID: AtomicUsize = AtomicUsize::new(0);
static ATOMIC_ID: AtomicUsize = AtomicUsize::new(0);

static RUNTIME: LazyLock<Runtime> = LazyLock::new(|| {
	let thread_num = num_cpus::get();
	println!("初始化线程池 ~~..CPU数量:{}", thread_num);

	Builder::new_multi_thread()
		.worker_threads(thread_num + 1)
		.thread_name_fn(|| {
			let id = ATOMIC_ID.fetch_add(1, Ordering::SeqCst);
			format!("w_{}", id)
		})
		.thread_stack_size(10 * 1024 * 1024)
		.enable_all()
		.on_thread_start(|| {
			println!(
				"{}:线程`{}`启动。。。",
				format_current_dt_by_default(),
				std::thread::current().name().unwrap()
			)
		})
		.on_thread_stop(|| {
			println!(
				"{}:线程`{}`停止。。",
				format_current_dt_by_default(),
				std::thread::current().name().unwrap()
			)
		})
		.build()
		.unwrap()
});

/**
 *获取全局线程池的arc副本。
 *
 *这个函数通过lazyStatic实现线程池的单例模式。如果线程池还未初始化，
 *则使用指定的配置进行初始化，并返回其arc引用。
 *
 *返回值:
 *arc<runtime>:线程池的原子引用计数副本，可安全地在多个线程间共享。
 */
pub fn get_rt() -> &'static Runtime {
	&RUNTIME
}
